package com.lagou.StuManageSystem;

import com.lagou.QuzManageSystem.ServerQuzCtrl;
import com.lagou.model.User;
import com.lagou.server.ServerDao;
import com.lagou.server.ServerInitClose;

import java.io.IOException;
import java.util.List;

public class ServerStuCtrl {
    /**
     * 声明一个List类型成员变量用于记录学生信息
     */
    private  List<User> list;

    /**
     * 使用合成复用原则
     */
    private  ServerInitClose sic;
    private  ServerDao sd;

    /**
     * 通过构造方法实现成员变量的初始化
     *
     * @param sic
     */
    public ServerStuCtrl(ServerInitClose sic, ServerDao sd) {
        this.sic = sic;
        this.sd = sd;
    }

    /**
     * 自定义成员方法获取客户端发送的信息并实现对应功能
     */
    public void stuCtrl() throws IOException, ClassNotFoundException {

        //导入学生账户信息
        list = sd.loadStudentData();
        //打印学生信息
        System.out.println("\n学生信息：" + list);
        //获取客户端发送的信息进入相应功能，调用对应方法
        while (true) {
            String s = sic.getBr().readLine();
            if ("add".equals(s)) {
                System.out.println("\n接收到添加学生信息的请求");
                //声明ServerStuCtrl的引用指向该类型的对象
                ServerStuCtrl ss = new ServerStuCtrl(sic, sd);
                ss.add1(list);
            } else if ("found".equals(s)) {
                System.out.println("\n接收到查找学生信息的请求");
                //声明ServerStuCtrl的引用指向该类型的对象
                ServerStuCtrl ss = new ServerStuCtrl(sic, sd);
                ss.found(list);
            } else if ("set".equals(s)) {
                System.out.println("\n接收到修改学生信息的请求");
                //声明ServerStuCtrl的引用指向该类型的对象
                ServerStuCtrl ss = new ServerStuCtrl(sic, sd);
                ss.set(list);
            } else if ("del".equals(s)) {
                System.out.println("\n接收到删除学生信息的请求");
                //声明ServerStuCtrl的引用指向该类型的对象
                ServerStuCtrl ss = new ServerStuCtrl(sic, sd);
                ss.del(list);
            } else if ("exit".equals(s)) {
                //保存学生账户信息
                sd.saveStudentDate(list);
                System.out.println("\n退出学生管理系统");
                return;
            }
        }
    }

    /**
     * 自定义成员方法实现服务器的添加学员功能
     *
     */
    public void add1(List<User> list) throws IOException, ClassNotFoundException {
        //读取客户端发送的学生信息
        User user = (User) sic.getOis().readObject();
        //如果没有学生信息则直接添加
        if(list.size() == 0) {
            list.add(user);
            sic.getPs().println("success");
        }else {
            for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
                //调用get方法得到User类型元素，再通过用户名进行比较
                if (list.get(i).getUserName().equals(user.getUserName())) {
                    //如果有相同的用户名则添加失败
                    sic.getPs().println("fail");
                    break;
                } else if ((i == list.size() - 1) && (!(list.get(i).getUserName().equals(user.getUserName())))) {
                    //如果遍历到最后一位都没有相同的信息，则添加到集合中
                    list.add(user);
                    sic.getPs().println("success");
                    break;
                }
            }
        }
        System.out.println("\n学员信息：" + list);
    }


    /**
     * 自定义成员方法实现服务器的查找功能
     * @throws IOException
     */
    public void found(List<User> list) throws IOException{
        //读取客户端发送的学生信息
        String name = sic.getBr().readLine();
        if(list.size() == 0){
            System.out.println("\n无学生信息，请先添加学生信息");
            sic.getPs().println("fail");
            sic.getPs().flush();
        }else {
            for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
                //调用list的get方法得到User类型元素，再通过用户名进行比较
                if (list.get(i).getUserName().equals(name)) {
                    //发送成功信息
                    sic.getPs().println("success");
                    //再通过对象输出流输出对象信息
                    sic.getOos().writeObject(list.get(i));
                    break;
                } else if ((i == list.size() - 1) && (!(list.get(i).getUserName().equals(name)))){
                    //如果遍历到最后一位都没有相同的信息，则返回删除失败信息
                    sic.getPs().println("fail");
                }
            }
        }
    }

    /**
     * 自定义成员方法实现服务器的修改学员功能
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public void set(List<User> list) throws IOException, ClassNotFoundException {
        //读取客户端发送的学生信息
        User user = (User) sic.getOis().readObject();
        if(list.size() == 0) {
            System.out.println("\n无学生信息，请先添加学生信息");
            sic.getPs().println("fail");
        }else {
            for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
                //调用get方法得到User类型元素，再通过用户名进行比较
                if (list.get(i).getUserName().equals(user.getUserName())) {
                    sic.getPs().println("success");
                    //接收修改后的User类对象，即学生信息
                    User user1 = (User) sic.getOis().readObject();
                    //调用set方法修改list集合对应位置的元素
                    list.set(i, user1);
                    break;
                } else if ((i == list.size() - 1) && (!(list.get(i).getUserName().equals(user.getUserName())))) {
                    //如果遍历到最后一位都没有相同的信息，则返回失败信息
                    sic.getPs().println("fail");
                }
            }
        }
        System.out.println("\n学员信息：" + list);
    }


    /**
     * 自定义成员方法实现服务器的删除学员功能
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public void del(List<User> list) throws IOException, ClassNotFoundException {
        //读取客户端发送的学生信息
        User user = (User) sic.getOis().readObject();
        if(list.size() == 0) {
            System.out.println("\n无学生信息，请先添加学生信息");
            sic.getPs().println("fail");
        }else {
            for (int i = 0; i < list.size(); ++i) {//从下标0，即第一个元素开始到最后一个元素，遍历整个集合
                //调用get方法得到User类型元素，再通过用户名进行比较
                if (list.get(i).getUserName().equals(user.getUserName())) {
                    //如果有相同信息，则删除
                    list.remove(list.get(i));
                    sic.getPs().println("success");
                    break;
                } else if ((i == list.size() - 1) && (!(list.get(i).getUserName().equals(user.getUserName())))) {
                    //如果遍历到最后一位都没有相同的信息，则返回删除失败信息
                    sic.getPs().println("fail");
                }
            }
        }
        System.out.println("\n学员信息：" + list);
    }

}
